home *** CD-ROM | disk | FTP | other *** search
/ Compendium Deluxe 2 / LSD and 17bit Compendium Deluxe - Volume II.iso / a / prog / asmsrc / tangosources.lha / sfx / play.s < prev    next >
Encoding:
Text File  |  2008-06-03  |  7.9 KB  |  493 lines

  1.  
  2. *****************************************************************************
  3.  
  4. ;­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  5. ;­   NoisetrackerV1.0 replayroutine   ­
  6. ;­ Mahoney & Kaktus - HALLONSOFT 1989 ­
  7. ;­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  8. ;*** PUT YOUR SOUNDMODULE TO Mt_data: !
  9.  
  10. Mt_init:lea    Mt_data,a0
  11.     move.l    a0,a1
  12.     add.l    #$3b8,a1
  13.     moveq    #$7f,d0
  14.     moveq    #0,d1
  15. Mt_loop:move.l    d1,d2
  16.     subq.w    #1,d0
  17. Mt_lop2:move.b    (a1)+,d1
  18.     cmp.b    d2,d1
  19.     bgt.s    Mt_loop
  20.     dbf    d0,Mt_lop2
  21.     addq.b    #1,d2
  22.  
  23.     lea    Mt_samplestarts(pc),a1
  24.     asl.l    #8,d2
  25.     asl.l    #2,d2
  26.     add.l    #$43c,d2
  27.     add.l    a0,d2
  28.     move.l    d2,a2
  29.     moveq    #$1e,d0
  30. Mt_lop3:clr.l    (a2)
  31.     move.l    a2,(a1)+
  32.     moveq    #0,d1
  33.     move.w    42(a0),d1
  34.     asl.l    #1,d1
  35.     add.l    d1,a2
  36.     add.l    #$1e,a0
  37.     dbf    d0,Mt_lop3
  38.  
  39.     or.b    #$2,$bfe001
  40.     move.b    #$6,Mt_speed
  41.     clr.w    $dff0a8
  42.     clr.w    $dff0b8
  43.     clr.w    $dff0c8
  44.     clr.w    $dff0d8
  45.     clr.b    Mt_songpos
  46.     clr.b    Mt_counter
  47.     clr.w    Mt_pattpos
  48.     rts
  49.  
  50. Mt_end:    clr.w    $dff0a8
  51.     clr.w    $dff0b8
  52.     clr.w    $dff0c8
  53.     clr.w    $dff0d8
  54.     move.w    #$f,$dff096
  55.     rts
  56.  
  57. Mt_music:
  58.     movem.l    d0-d4/a0-a3/a5-a6,-(a7)
  59.     lea    Mt_data,a0
  60.     addq.b    #$1,Mt_counter
  61.     move.b    Mt_counter,D0
  62.     cmp.b    Mt_speed,D0
  63.     blt.s    Mt_nonew
  64.     clr.b    Mt_counter
  65.     bra    Mt_getnew
  66.  
  67. Mt_nonew:
  68.     lea    Mt_voice1(pc),a6
  69.     lea    $dff0a0,a5
  70.     bsr    Mt_checkcom
  71.     lea    Mt_voice2(pc),a6
  72.     lea    $dff0b0,a5
  73.     bsr    Mt_checkcom
  74.     lea    Mt_voice3(pc),a6
  75.     lea    $dff0c0,a5
  76.     bsr    Mt_checkcom
  77.     lea    Mt_voice4(pc),a6
  78.     lea    $dff0d0,a5
  79.     bsr    Mt_checkcom
  80.     bra    Mt_endr
  81.  
  82. Mt_arpeggio:
  83.     moveq    #0,d0
  84.     move.b    Mt_counter,d0
  85.     divs    #$3,d0
  86.     swap    d0
  87.     cmp.w    #$0,d0
  88.     beq.s    Mt_arp2
  89.     cmp.w    #$2,d0
  90.     beq.s    Mt_arp1
  91.  
  92.     moveq    #0,d0
  93.     move.b    $3(a6),d0
  94.     lsr.b    #4,d0
  95.     bra.s    Mt_arp3
  96. Mt_arp1:moveq    #0,d0
  97.     move.b    $3(a6),d0
  98.     and.b    #$f,d0
  99.     bra.s    Mt_arp3
  100. Mt_arp2:move.w    $10(a6),d2
  101.     bra.s    Mt_arp4
  102. Mt_arp3:asl.w    #1,d0
  103.     moveq    #0,d1
  104.     move.w    $10(a6),d1
  105.     lea    Mt_periods(pc),a0
  106.     moveq    #$24,d7
  107. Mt_arploop:
  108.     move.w    (a0,d0.w),d2
  109.     cmp.w    (a0),d1
  110.     bge.s    Mt_arp4
  111.     addq.l    #2,a0
  112.     dbf    d7,Mt_arploop
  113.     rts
  114. Mt_arp4:move.w    d2,$6(a5)
  115.     rts
  116.  
  117. Mt_getnew:
  118.     lea    Mt_data,a0
  119.     move.l    a0,a3
  120.     move.l    a0,a2
  121.     add.l    #$c,a3
  122.     add.l    #$3b8,a2
  123.     add.l    #$43c,a0
  124.  
  125.     moveq    #0,d0
  126.     move.l    d0,d1
  127.     move.b    Mt_songpos,d0
  128.     move.b    (a2,d0.w),d1
  129.     asl.l    #8,d1
  130.     asl.l    #2,d1
  131.     add.w    Mt_pattpos,d1
  132.     clr.w    Mt_dmacon
  133.  
  134.     lea    $dff0a0,a5
  135.     Clr.l    offset
  136.     lea    Mt_voice1(pc),a6
  137.     Move.l    #Equa1,Offset
  138. asas
  139.     bsr.s    Mt_playvoice
  140.     lea    $dff0b0,a5
  141.     lea    Mt_voice2(pc),a6
  142.     Move.l    #Equa2,Offset
  143.     bsr.s    Mt_playvoice
  144.     lea    $dff0c0,a5
  145.     lea    Mt_voice3(pc),a6
  146.     Move.l    #Equa3,Offset
  147.     bsr.s    Mt_playvoice
  148.     lea    $dff0d0,a5
  149.     lea    Mt_voice4(pc),a6
  150.     Move.l    #Equa4,Offset
  151.     bsr.s    Mt_playvoice
  152.     bra    Mt_setdma
  153.  
  154. Mt_playvoice:
  155.     move.l    (a0,d1.l),(a6)
  156.     addq.l    #4,d1
  157.     moveq    #0,d2
  158.     move.b    $2(a6),d2
  159.     and.b    #$f0,d2
  160.     lsr.b    #4,d2
  161.     move.b    (a6),d0
  162.     and.b    #$f0,d0
  163.     or.b    d0,d2
  164.     tst.b    d2
  165.     beq.s    Mt_setregs
  166.     moveq    #0,d3
  167.     lea    Mt_samplestarts(pc),a1
  168.     move.l    d2,d4
  169.     subq.l    #$1,d2
  170.     asl.l    #2,d2
  171.     mulu    #$1e,d4
  172.     move.l    (a1,d2.l),$4(a6)
  173.     move.w    (a3,d4.l),$8(a6)
  174.     move.w    $2(a3,d4.l),$12(a6)
  175.     move.w    $4(a3,d4.l),d3
  176.     tst.w    d3
  177.     beq.s    Mt_noloop
  178.     move.l    $4(a6),d2
  179.     asl.w    #1,d3
  180.     add.l    d3,d2
  181.     move.l    d2,$a(a6)
  182.     move.w    $4(a3,d4.l),d0
  183.     add.w    $6(a3,d4.l),d0
  184.     move.w    d0,8(a6)
  185.     move.w    $6(a3,d4.l),$e(a6)
  186.     move.w    $12(a6),$8(a5)
  187.     bra.s    Mt_setregs
  188. Mt_noloop:
  189.     move.l    $4(a6),d2
  190.     add.l    d3,d2
  191.     move.l    d2,$a(a6)
  192.     move.w    $6(a3,d4.l),$e(a6)
  193.     move.w    $12(a6),$8(a5)
  194. Mt_setregs:
  195.     move.w    (a6),d0
  196.     and.w    #$fff,d0
  197.     beq    Mt_checkcom2
  198.     move.b    $2(a6),d0
  199.     and.b    #$F,d0
  200.     cmp.b    #$3,d0
  201.     bne.s    Mt_setperiod
  202.     bsr    Mt_setmyport
  203.     bra    Mt_checkcom2
  204. Mt_setperiod:
  205. asas1    Move.l    Offset,A4
  206.     Move.w    #$fff,(A4)
  207.     move.w    (a6),$10(a6)
  208.     and.w    #$fff,$10(a6)
  209.     move.w    $14(a6),d0
  210.     move.w    d0,$dff096
  211.     clr.b    $1b(a6)
  212.  
  213.     move.l    $4(a6),(a5)
  214.     move.w    $8(a6),$4(a5)
  215.     move.w    $10(a6),d0
  216.     and.w    #$fff,d0
  217.     move.w    d0,$6(a5)
  218.     move.w    $14(a6),d0
  219.     or.w    d0,Mt_dmacon
  220.     bra    Mt_checkcom2
  221.  
  222. Mt_setdma:
  223.     move.w    #$12c,d0
  224. Mt_wait:dbf    d0,Mt_wait
  225.     move.w    Mt_dmacon,d0
  226.     or.w    #$8000,d0
  227.     move.w    d0,$dff096
  228.     move.w    #$12c,d0
  229. Mt_wai2:dbf    d0,Mt_wai2
  230.     lea    $dff000,a5
  231.     lea    Mt_voice4(pc),a6
  232.     move.l    $a(a6),$d0(a5)
  233.     move.w    $e(a6),$d4(a5)
  234.     lea    Mt_voice3(pc),a6
  235.     move.l    $a(a6),$c0(a5)
  236.     move.w    $e(a6),$c4(a5)
  237.     lea    Mt_voice2(pc),a6
  238.     move.l    $a(a6),$b0(a5)
  239.     move.w    $e(a6),$b4(a5)
  240.     lea    Mt_voice1(pc),a6
  241.     move.l    $a(a6),$a0(a5)
  242.     move.w    $e(a6),$a4(a5)
  243.  
  244.     add.w    #$10,Mt_pattpos
  245.     cmp.w    #$400,Mt_pattpos
  246.     bne.s    Mt_endr
  247. Mt_nex:    clr.w    Mt_pattpos
  248.     clr.b    Mt_break
  249.     addq.b    #1,Mt_songpos
  250.     and.b    #$7f,Mt_songpos
  251.     move.b    Mt_songpos,d1
  252.     cmp.b    Mt_data+$3b6,d1
  253.     bne.s    Mt_endr
  254.     move.b    Mt_data+$3b7,Mt_songpos
  255. Mt_endr:tst.b    Mt_break
  256.     bne.s    Mt_nex
  257.     movem.l    (a7)+,d0-d4/a0-a3/a5-a6
  258.     rts
  259.  
  260. Mt_setmyport:
  261.     move.w    (a6),d2
  262.     and.w    #$fff,d2
  263.     move.w    d2,$18(a6)
  264.     move.w    $10(a6),d0
  265.     clr.b    $16(a6)
  266.     cmp.w    d0,d2
  267.     beq.s    Mt_clrport
  268.     bge.s    Mt_rt
  269.     move.b    #$1,$16(a6)
  270.     rts
  271. Mt_clrport:
  272.     clr.w    $18(a6)
  273. Mt_rt:    rts
  274.  
  275. Mt_myport:
  276.     move.b    $3(a6),d0
  277.     beq.s    Mt_myslide
  278.     move.b    d0,$17(a6)
  279.     clr.b    $3(a6)
  280. Mt_myslide:
  281.     tst.w    $18(a6)
  282.     beq.s    Mt_rt
  283.     moveq    #0,d0
  284.     move.b    $17(a6),d0
  285.     tst.b    $16(a6)
  286.     bne.s    Mt_mysub
  287.     add.w    d0,$10(a6)
  288.     move.w    $18(a6),d0
  289.     cmp.w    $10(a6),d0
  290.     bgt.s    Mt_myok
  291.     move.w    $18(a6),$10(a6)
  292.     clr.w    $18(a6)
  293. Mt_myok:move.w    $10(a6),$6(a5)
  294.     rts
  295. Mt_mysub:
  296.     sub.w    d0,$10(a6)
  297.     move.w    $18(a6),d0
  298.     cmp.w    $10(a6),d0
  299.     blt.s    Mt_myok
  300.     move.w    $18(a6),$10(a6)
  301.     clr.w    $18(a6)
  302.     move.w    $10(a6),$6(a5)
  303.     rts
  304.  
  305. Mt_vib:    move.b    $3(a6),d0
  306.     beq.s    Mt_vi
  307.     move.b    d0,$1a(a6)
  308.  
  309. Mt_vi:    move.b    $1b(a6),d0
  310.     lea    Mt_sin(pc),a4
  311.     lsr.w    #$2,d0
  312.     and.w    #$1f,d0
  313.     moveq    #0,d2
  314.     move.b    (a4,d0.w),d2
  315.     move.b    $1a(a6),d0
  316.     and.w    #$f,d0
  317.     mulu    d0,d2
  318.     lsr.w    #$6,d2
  319.     move.w    $10(a6),d0
  320.     tst.b    $1b(a6)
  321.     bmi.s    Mt_vibmin
  322.     add.w    d2,d0
  323.     bra.s    Mt_vib2
  324. Mt_vibmin:
  325.     sub.w    d2,d0
  326. Mt_vib2:move.w    d0,$6(a5)
  327.     move.b    $1a(a6),d0
  328.     lsr.w    #$2,d0
  329.     and.w    #$3c,d0
  330.     add.b    d0,$1b(a6)
  331.     rts
  332.  
  333. Mt_nop:    move.w    $10(a6),$6(a5)
  334.     rts
  335.  
  336. Mt_checkcom:
  337.     move.w    $2(a6),d0
  338.     and.w    #$fff,d0
  339.     beq.s    Mt_nop
  340.     move.b    $2(a6),d0
  341.     and.b    #$f,d0
  342.     tst.b    d0
  343.     beq    Mt_arpeggio
  344.     cmp.b    #$1,d0
  345.     beq.s    Mt_portup
  346.     cmp.b    #$2,d0
  347.     beq    Mt_portdown
  348.     cmp.b    #$3,d0
  349.     beq    Mt_myport
  350.     cmp.b    #$4,d0
  351.     beq    Mt_vib
  352.     move.w    $10(a6),$6(a5)
  353.     cmp.b    #$a,d0
  354.     beq.s    Mt_volslide
  355.     rts
  356.  
  357. Mt_volslide:
  358.     moveq    #0,d0
  359.     move.b    $3(a6),d0
  360.     lsr.b    #4,d0
  361.     tst.b    d0
  362.     beq.s    Mt_voldown
  363.     add.w    d0,$12(a6)
  364.     cmp.w    #$40,$12(a6)
  365.     bmi.s    Mt_vol2
  366.     move.w    #$40,$12(a6)
  367. Mt_vol2:move.w    $12(a6),$8(a5)
  368.     rts
  369.  
  370. Mt_voldown:
  371.     moveq    #0,d0
  372.     move.b    $3(a6),d0
  373.     and.b    #$f,d0
  374.     sub.w    d0,$12(a6)
  375.     bpl.s    Mt_vol3
  376.     clr.w    $12(a6)
  377. Mt_vol3:move.w    $12(a6),$8(a5)
  378.     rts
  379.  
  380. Mt_portup:
  381.     moveq    #0,d0
  382.     move.b    $3(a6),d0
  383.     sub.w    d0,$10(a6)
  384.     move.w    $10(a6),d0
  385.     and.w    #$fff,d0
  386.     cmp.w    #$71,d0
  387.     bpl.s    Mt_por2
  388.     and.w    #$f000,$10(a6)
  389.     or.w    #$71,$10(a6)
  390. Mt_por2:move.w    $10(a6),d0
  391.     and.w    #$fff,d0
  392.     move.w    d0,$6(a5)
  393.     rts
  394.  
  395. Mt_portdown:
  396.     clr.w    d0
  397.     move.b    $3(a6),d0
  398.     add.w    d0,$10(a6)
  399.     move.w    $10(a6),d0
  400.     and.w    #$fff,d0
  401.     cmp.w    #$358,d0
  402.     bmi.s    Mt_por3
  403.     and.w    #$f000,$10(a6)
  404.     or.w    #$358,$10(a6)
  405. Mt_por3:move.w    $10(a6),d0
  406.     and.w    #$fff,d0
  407.     move.w    d0,$6(a5)
  408.     rts
  409.  
  410. Mt_checkcom2:
  411.     move.b    $2(a6),d0
  412.     and.b    #$f,d0
  413.     cmp.b    #$e,d0
  414.     beq.s    Mt_setfilt
  415.     cmp.b    #$d,d0
  416.     beq.s    Mt_pattbreak
  417.     cmp.b    #$b,d0
  418.     beq.s    Mt_posjmp
  419.     cmp.b    #$c,d0
  420.     beq.s    Mt_setvol
  421.     cmp.b    #$f,d0
  422.     beq.s    Mt_setspeed
  423.     rts
  424.  
  425. Mt_setfilt:
  426.     move.b    $3(a6),d0
  427.     and.b    #$1,d0
  428.     asl.b    #$1,d0
  429.     and.b    #$fd,$bfe001
  430.     or.b    d0,$bfe001
  431.     rts
  432. Mt_pattbreak:
  433.     not.b    Mt_break
  434.     rts
  435. Mt_posjmp:
  436.     move.b    $3(a6),d0
  437.     subq.b    #$1,d0
  438.     move.b    d0,Mt_songpos
  439.     not.b    Mt_break
  440.     rts
  441. Mt_setvol:
  442.     cmp.b    #$40,$3(a6)
  443.     ble.s    Mt_vol4
  444.     move.b    #$40,$3(a6)
  445. Mt_vol4:move.b    $3(a6),$8(a5)
  446.     rts
  447. Mt_setspeed:
  448.     cmp.b    #$1f,$3(a6)
  449.     ble.s    Mt_sets
  450.     move.b    #$1f,$3(a6)
  451. Mt_sets:move.b    $3(a6),d0
  452.     beq.s    Mt_rts2
  453.     move.b    d0,Mt_speed
  454.     clr.b    Mt_counter
  455. Mt_rts2:rts
  456.  
  457. Mt_sin:
  458.  DC.b $00,$18,$31,$4a,$61,$78,$8d,$a1,$b4,$c5,$d4,$e0,$eb,$f4,$fa,$fd
  459.  DC.b $ff,$fd,$fa,$f4,$eb,$e0,$d4,$c5,$b4,$a1,$8d,$78,$61,$4a,$31,$18
  460.  
  461. Mt_periods:
  462.  DC.w $0358,$0328,$02fa,$02d0,$02a6,$0280,$025c,$023a,$021a,$01fc,$01e0
  463.  DC.w $01c5,$01ac,$0194,$017d,$0168,$0153,$0140,$012e,$011d,$010d,$00fe
  464.  DC.w $00f0,$00e2,$00d6,$00ca,$00be,$00b4,$00aa,$00a0,$0097,$008f,$0087
  465.  DC.w $007f,$0078,$0071,$0000,$0000
  466.  
  467. Mt_speed:    DC.b    6
  468. Mt_songpos:    DC.b    0
  469. Mt_pattpos:    DC.w    0
  470. Mt_counter:    DC.b    0
  471.  
  472. Mt_break:    DC.b    0
  473. Mt_dmacon:    DC.w    0
  474. Mt_samplestarts:DS.L    $1f
  475. Mt_voice1:    DS.w    10
  476.         DC.w    1
  477.         DS.w    3
  478. Mt_voice2:    DS.w    10
  479.         DC.w    2
  480.         DS.w    3
  481. Mt_voice3:    DS.w    10
  482.         DC.w    4
  483.         DS.w    3
  484. Mt_voice4:    DS.w    10
  485.         DC.w    8
  486.         DS.w    3
  487. Offset        Dc.l    0
  488. Equa1        Dc.l    0
  489. Equa2        Dc.l    0
  490. Equa3        Dc.l    0
  491. Equa4        Dc.l    0
  492.  
  493.